package config

import (
	"fmt"
	"os"
	"time"

	"gopkg.in/yaml.v3"
)

// Config SMTP服务器配置
type Config struct {
	Server ServerConfig `yaml:"server"`
	SMTP   SMTPConfig   `yaml:"smtp"`
	Log    LogConfig    `yaml:"log"`
}

// ServerConfig 服务器配置
type ServerConfig struct {
	Host         string        `yaml:"host"`          // 监听地址
	Ports        []int         `yaml:"ports"`         // 监听端口
	ReadTimeout  time.Duration `yaml:"read_timeout"`  // 读取超时
	WriteTimeout time.Duration `yaml:"write_timeout"` // 写入超时
	MaxConn      int           `yaml:"max_conn"`      // 最大连接数
	IdleTimeout  time.Duration `yaml:"idle_timeout"`  // 连接空闲超时
	NetworkLib   string        `yaml:"network_lib"`   // 网络库选择: "net"、"netpoll"、"gnet"
	TLS          TLSConfig     `yaml:"tls"`           // TLS配置
}

// SMTPConfig SMTP特定配置
type SMTPConfig struct {
	Domain          string   `yaml:"domain"`             // 服务器域名
	MaxMessageSize  int64    `yaml:"max_message_size"`   // 最大邮件大小(bytes)
	MaxRecipients   int      `yaml:"max_recipients"`     // 每封邮件最大收件人数
	AllowedDomains  []string `yaml:"allowed_domains"`    // 允许的域名列表
	RequireAuth     bool     `yaml:"require_auth"`       // 是否需要认证
	AuthMethods     []string `yaml:"auth_methods"`       // 支持的认证方法
	GreetingMessage string   `yaml:"greeting_message"`   // 欢迎消息
	MaxMailsPerConn int      `yaml:"max_mails_per_conn"` // 单个连接允许发送的最大邮件数
}

// LogConfig 日志配置
type LogConfig struct {
	Level      string `yaml:"level"`       // 日志级别
	File       string `yaml:"file"`        // 日志文件路径
	MaxSize    int    `yaml:"max_size"`    // 单个日志文件最大大小(MB)
	MaxBackups int    `yaml:"max_backups"` // 最大备份数
	MaxAge     int    `yaml:"max_age"`     // 日志保留天数
	Compress   bool   `yaml:"compress"`    // 是否压缩
}

// TLSConfig TLS配置
type TLSConfig struct {
	Enabled      bool     `yaml:"enabled"`       // 是否启用TLS
	CertFile     string   `yaml:"cert_file"`     // 证书文件路径
	KeyFile      string   `yaml:"key_file"`      // 私钥文件路径
	MinVersion   string   `yaml:"min_version"`   // 最低TLS版本
	MaxVersion   string   `yaml:"max_version"`   // 最高TLS版本
	CipherSuites []string `yaml:"cipher_suites"` // 允许的加密套件
}

// LoadConfig 从文件加载配置
func LoadConfig(path string) (*Config, error) {
	data, err := os.ReadFile(path)
	if err != nil {
		return nil, fmt.Errorf("读取配置文件失败: %v", err)
	}

	var config Config
	if err := yaml.Unmarshal(data, &config); err != nil {
		return nil, fmt.Errorf("解析配置文件失败: %v", err)
	}

	// 设置默认值
	if config.Server.Host == "" {
		config.Server.Host = "0.0.0.0"
	}
	if len(config.Server.Ports) == 0 {
		config.Server.Ports = []int{25, 2525, 465, 586}
	}
	if config.Server.NetworkLib == "" {
		config.Server.NetworkLib = "gnet"
	}
	if config.Server.ReadTimeout == 0 {
		config.Server.ReadTimeout = 5 * time.Minute
	}
	if config.Server.WriteTimeout == 0 {
		config.Server.WriteTimeout = 5 * time.Minute
	}
	if config.Server.MaxConn == 0 {
		config.Server.MaxConn = 1000
	}

	return &config, nil
}
